from common.error_handler import RequiredParamError, ParamConvertIntError


def valid_param_filter(json_dict: dict, valid_list):
    """
    :param json_dict: flask 请求接受参数字典  ex: request.get_json()  dict(request.args)
    :param valid_list: 有效参数列表 ex: ["name"] 过滤掉除了name以外的无效请求参数
    :return: 无返回值，直接操作传入字典
    """
    valid_json_dict = {}
    for key in valid_list:
        if key in json_dict:
            valid_json_dict[key] = json_dict[key]
    json_dict.clear()
    json_dict.update(valid_json_dict)


def required_param_check(json_dict, required_list):
    """
    :param json_dict: flask 请求接受参数字典  ex: request.get_json()  dict(request.args)
    :param required_list: 必填参数列表
    ex: ["name"]  校验请求参数字典中包含 name 且 值不为空 None
    :return: 校验通过，无返回值，校验失败，抛出必填参数异常，由flask errorHandler处理
    """
    for key in required_list:
        # 必填判断: key存在且值不为空
        if key not in json_dict or json_dict[key] is None:
            raise RequiredParamError(key)


def remove_empty_param(json_dict, empty_list):
    """
    :param json_dict: flask 请求接受参数字典  ex: request.get_json()  dict(request.args)
    :param empty_list: 空的参数列表 ex: ["age"] 校验 age如果为None 或者 空字符串"" 则从请求字典中去除
    :return: 无返回值，直接操作传入字典
    """
    for key in empty_list:
        if key in json_dict and json_dict[key] in (None, ""):
                json_dict.pop(key)


def set_param_default(json_dict, default_list):
    """
    :param json_dict: flask 请求接受参数字典  ex: request.get_json()  dict(request.args)
    :param default_list: 默认参数列表 ex: [("name","xpcs")]
    若 name 不在请求字典中，或者 name 值为 None 或者空字符串"" 则将name至为默认值 xpcs
    :return: 无返回值，直接操作传入字典
    """
    for key in default_list:
        if json_dict.get(key[0]) in (None, ""):
            json_dict[key[0]] = key[1]


def param_convert_int(json_dict, convert_list):
    """
    :param json_dict: flask 请求接受参数字典  ex: request.get_json()  dict(request.args)
    :param convert_list: 转换数字参数列表 ，对字段做了数字类型的校验，并将其转换成数字
    ex: ["age"] 则将请求字典中 age 对应 value 转换为数字 int类型
    :return: 无返回值，直接操作传入字典
    """
    for key in convert_list:
        # 转换数字参数，可能是可选参数，传空字符串被上游去除，所以加入判断
        if key in json_dict and not isinstance(json_dict[key], int):
            try:
                json_dict[key] = int(json_dict[key])
            except ValueError:
                raise ParamConvertIntError(key)



